]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
layout: Add MonitorConstraint:work-area property
authorFlorian Müllner <fmuellner@gnome.org>
Fri, 6 Feb 2015 18:27:02 +0000 (19:27 +0100)
committerFlorian Müllner <fmuellner@gnome.org>
Fri, 20 Feb 2015 16:40:48 +0000 (17:40 +0100)
Occasionally it makes sense to constrain to a monitor's work-area
rather than the entire monitor, so implement that behavior and add
a property to turn it on.

https://bugzilla.gnome.org/show_bug.cgi?id=744850

js/ui/layout.js

index d03bb7688a5225329a87686a28464040920ae599..c6816884882c8fa2f44b445615747d00f86683e2 100644 (file)
@@ -45,11 +45,16 @@ const MonitorConstraint = new Lang.Class({
                  'index': GObject.ParamSpec.int('index',
                                                 'Monitor index', 'Track specific monitor',
                                                 GObject.ParamFlags.READABLE | GObject.ParamFlags.WRITABLE,
-                                                -1, 64, -1)},
+                                                -1, 64, -1),
+                 'work-area': GObject.ParamSpec.boolean('work-area',
+                                                        'Work-area', 'Track monitor\'s work-area',
+                                                        GObject.ParamFlags.READABLE | GObject.ParamFlags.WRITABLE,
+                                                        false)},
 
     _init: function(props) {
         this._primary = false;
         this._index = -1;
+        this._workArea = false;
 
         this.parent(props);
     },
@@ -79,6 +84,19 @@ const MonitorConstraint = new Lang.Class({
         this.notify('index');
     },
 
+    get work_area() {
+        return this._workArea;
+    },
+
+    set work_area(v) {
+        if (v == this._workArea)
+            return;
+        this._workArea = v;
+        if (this.actor)
+            this.actor.queue_relayout();
+        this.notify('work-area');
+    },
+
     vfunc_set_actor: function(actor) {
         if (actor) {
             if (!this._monitorsChangedId) {
@@ -86,10 +104,21 @@ const MonitorConstraint = new Lang.Class({
                     this.actor.queue_relayout();
                 }));
             }
+
+            if (!this._workareasChangedId) {
+                this._workareasChangedId = global.screen.connect('workareas-changed', Lang.bind(this, function() {
+                    if (this._workArea)
+                        this.actor.queue_relayout();
+                }));
+            }
         } else {
             if (this._monitorsChangedId)
                 Main.layoutManager.disconnect(this._monitorsChangedId);
             this._monitorsChangedId = 0;
+
+            if (this._workareasChangedId)
+                global.screen.disconnect(this._workareasChangedId);
+            this._workareasChangedId = 0;
         }
 
         this.parent(actor);
@@ -99,15 +128,21 @@ const MonitorConstraint = new Lang.Class({
         if (!this._primary && this._index < 0)
             return;
 
-        let monitor;
-        if (this._primary) {
-            monitor = Main.layoutManager.primaryMonitor;
+        let index;
+        if (this._primary)
+            index = Main.layoutManager.primaryIndex;
+        else
+            index = Math.min(this._index, Main.layoutManager.monitors.length - 1);
+
+        let rect;
+        if (this._workArea) {
+            let ws = global.screen.get_workspace_by_index(0);
+            rect = ws.get_work_area_for_monitor(index);
         } else {
-            let index = Math.min(this._index, Main.layoutManager.monitors.length - 1);
-            monitor = Main.layoutManager.monitors[index];
+            rect = Main.layoutManager.monitors[index];
         }
 
-        actorBox.init_rect(monitor.x, monitor.y, monitor.width, monitor.height);
+        actorBox.init_rect(rect.x, rect.y, rect.width, rect.height);
     }
 });